package kr.co.doriclassic.chapter23;

/**생산자-버퍼-소비자 예제
 * @author M201_06
 *이상현상이 발견되면 문자를 보낸다.
 *만일 이것이 구현되지 않으면 cpu는 계속 감시를 해야 할 것이다.
 */ 
public class Buffer {
	private int data;//실제 데이터
	private boolean empty=true;//버퍼가 비었는지 여부
	
	//데이터를 넣는다(생산자).
	public synchronized void put(int data){
		while (!empty) {//가득찼다면
			try {
				wait();//버퍼가 빌 때까지 대기한다.
			} catch (InterruptedException e) {}
		}		
		this.data = data;//데이터를 넣는다.
		empty = false;//방이 비지 않았다. 
		notifyAll();//소비자를 꺠운다.
	}
	
	//데이터를 뺀다(소비자).
	public synchronized int get(){
		while (empty) {//비었다면
			try {
				wait();//버퍼가 가득찰 때까지 대기한다.
			} catch (InterruptedException e) {}
		}
		empty = true;//방이 비었다.
		notifyAll();//생산자를 꺠운다.
		return data;//데이터를 넣는다.			
	}	
}
